﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace конфигуратор
{
    public class Команда      // адрес некорого объекта
    {
        public string Агент;          //  АгентФайлов    =СУБЪЕКТ      // для памяти (кучи) Агент отсутвует поскольку это должен быть список кучи параметр это ссылка на объект(адрес памяти)
        public string Цель;         //   ПолучитьОбъект     = ЦЕЛЬ                               // для содержания файла BinaryReader и BinaryWriter
        public Dictionary<string, object> Средства;      // имя файла    // пареметром может быть другой адрес        ЭТО СРЕДСТВА ДОСТИЖЕНИЯ ЦЕЛИ
        public Команда ВложеннаяКоманда;    // следующая команда

        public object ПолучитьРезультат ()        // вложенная команда
        {
            dynamic agent = СоздатьАгент();
            foreach ( KeyValuePair<string, object> keyValuePair in Средства )
            {
                if ( keyValuePair.Value.GetType() == typeof( Команда ) )
                    Средства[keyValuePair.Key] = (( Команда ) keyValuePair.Value).ПолучитьРезультат(); // замена  адресов значениями, хотя есть вариант когда передать надо именно адрес
                // адрес или парметр должен иметь указание на целевого испонителя(агента)
            }
            object результат = Выполнить( agent, Цель, Средства, ВложеннаяКоманда );

            return результат;
        }

        private object Выполнить ( object agent, string команда, Dictionary<string, object> параметры, Команда вложеннаякоманда )
        {
            throw new NotImplementedException();
        }
                                                                                    
        private object СоздатьАгент ()
        {
            throw new NotImplementedException();
        }

        // для объекта   это
         void test()
         {
             var f = new Команда() {Агент = "АгентФайлов", Цель = "ПолучитьОбъект "};
             f.Средства["имя файла"]= "e://файл.расш" ;
             // АгентДиспетчера.ПолучитьДиспетчер( Имя = дис1)/АгентДиспетчера.ПолучитьОбъект( имя = строка)

         }


    }

    //public class АгентДиспетчера
    //{
    //   public object ПолучитьДиспетчер(Dictionary<string, object> параметры, Команда команда)
    //   {
    //       var дис= Диспетчер.Найти("Имя");
    //       команда.Средства["диспетчер"] = дис;
    //       var рез =   команда.ПолучитьРезультат();
    //       return рез;
    //   }
    //   public object ПолучитьПараметрДиспетчер ( Dictionary<string, object> параметры, Команда команда )
    //   {
    //       return Диспетчер.Найти("Имя");        //здесь результат сам агент, его не надо создавать
           
    //   }
    //    public object ПолучитьОбъект(Dictionary<string, object> средства, Команда команда )
    //    {
    //        var дис =(Диспетчер) средства["диспетчер"];
    //        return дис.НайтиПервыйПаспортПоИмени((string) средства["имя"]).Объект;
    //    }
    //}

    public class АгентСтрок
    {
        public string Соединить( Dictionary<string, object> параметры, Команда команда  )
        {
            return (string) параметры["1"] + (string) параметры["2"];
        }
    }

}
